/**    
 * 文件名：IDdLockService.java</br>
 *    
 * 版本信息：v1.0</br>
 * 日期：2017年6月26日</br>
 * © 2005-2017 雷技信息科技（上海）有限公司版权所有</br>
 *
 */
package com.logic.landseaserver.service;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.logic.landseaserver.common.exception.LandseaException;
import com.logic.landseaserver.domain.DdingEventCallbackEvt;
import com.logic.landseaserver.domain.DdingModPwdLog;
import com.logic.landseaserver.domain.DdingProjectConfig;
import com.logic.landseaserver.domain.DdingPwdCallbackEvt;
import com.logic.landseaserver.domain.DdingRoomSync;

/**
 *
 * 项目名称：system-server</br>
 * 类名称：IDdLockService</br>
 * 类描述：云丁锁业务接口</br>
 * 创建人：Aaron</br>
 * 创建时间：2017年6月26日 下午4:48:36</br>
 * 
 * @version 1.0
 *
 */
public interface IDdLockService
{
    /** 实现beanId **/
    public static final String BEANID = "ddLockService";
    
    /**
     * 
     * [简要描述]：同步公寓及房间</br>
     * [详细描述]：向云丁同步</br>
     * [作者]：Aaron(2017-06-28)</br>
     *
     * @param projectId 项目ID
     * @throws LandseaException 朗诗寓异常
     *
     */
    public void syncHomeAndRooms(int projectId)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：保存项目云丁配置</br>
     * [详细描述]：有则更新，没有走新增</br>
     * [作者]：Aaron(2017-06-30)</br>
     *
     * @param projectConfigArray 项目云丁相关配置,每一条配置就是一个元素
     * @return 影响的行数
     * @throws LandseaException 如果没有抛出异常，则认为成功
     *
     */
    public int saveDdingProjectConfig(DdingProjectConfig[] projectConfigArray)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：保存项目云丁配置</br>
     * [详细描述]：有则更新，没有走新增</br>
     * [作者]：Aaron(2017-06-30)</br>
     *
     * @param projectId 项目Id
     * @return 项目配置
     * @throws LandseaException
     *
     */
    public List<DdingProjectConfig> getDdingProjectConfig(Integer projectId)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：获取项目房间同步情况及安装锁情况</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-06-30)</br>
     *
     * @param projectId 项目Id
     * @return 统计结果
     *
     */
    public Map<String, Object> ddingProjectRoomStatistic(Integer projectId);
    
    /**
     * 
     * [简要描述]：修改门锁密码，通知云丁修改密码</br>
     * [详细描述]：异步接口，云丁修改成功与否会回调另外的本地接口</br>
     * [作者]：Aaron(2017-06-30)</br>
     *
     * @param roomId
     * @throws LandseaException
     *
     */
    public void modifyDoorPassword(Integer roomId)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：云丁事件回调</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-03)</br>
     *
     * @param callbackEvent
     * @throws LandseaException
     *
     */
    public void eventCallback(DdingEventCallbackEvt callbackEvent)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：云丁密码操作回调</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-03)</br>
     *
     * @param callbackEvent
     * @throws LandseaException
     *
     */
    public void passwordEventCallback(DdingPwdCallbackEvt callbackEvent)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：发送修改密码短信</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-04)</br>
     *
     * @param ddingRoomSync
     * @throws LandseaException
     *
     */
    public void sendPwdMsgToUser(DdingRoomSync ddingRoomSync)
        throws LandseaException;
    
    /**
     * 
     * [简要描述]：获取云丁修改门锁密码日志</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-05)</br>
     *
     * @return 日志集合
     * @throws LandseaException
     *
     */
    public List<DdingModPwdLog> getModifyPwdLog(Integer roomId) throws LandseaException;
    
    /**
     * 
     * [简要描述]：重置密码有效期</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-18)</br>
     *
     * @param roomId 房间id，不为空时以该值为准
     * @param contractId 合同Id，若roomId为空，根据合同id查询合同获取roomId
     * @param pwdEndTime 门锁失效时间（禁止设置为过去的时间，不然会失败）,如果为null，则根据账单实际情况走
     *
     */
    public void resetPasswordEffectiveTime(Integer roomId, Integer contractId, Date pwdEndTime);
    
    /**
     * 
     * [简要描述]：检查项目是否存在云丁配置</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-25)</br>
     *
     * @param projectId
     * @return
     * @throws LandseaException
     *
     */
    public Map<String,Object> checkProjectConfigExists(Integer projectId) throws LandseaException;
    
    /**
     * 
     * [简要描述]：获取门锁密码有效期</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-05)</br>
     *
     * @throws LandseaException
     *
     */
    public String getRoomPwdEffectiveTime(Integer roomId) throws LandseaException;
    
    public void addLockPassword(DdingRoomSync ddingRoomSync, boolean isNeedChangePwdText, Date pwdEndTime,
        boolean isNeedSendSms)throws LandseaException;

    void updateSynRoomByPrjId(Integer prjId)throws LandseaException;;
}
